home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DRIVES.SWG / 0059_Disk Labels-Volumes.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  6KB  |  199 lines

  1. {
  2. > Can someone please post some code on how to read a disk
  3. > label/serial number from a disk. I plan to use it as a copy
  4. > protection method (read the label/serial number on installation
  5. > and only the program to install on a drive the same
  6. > label/serial number) Thanks!
  7. }
  8.  
  9. const BSize    = 4096; { I/O Buffer Size }
  10.       HexDigits: array[0..15] of char = '0123456789ABCDEF';
  11. type  InfoBuffer = record
  12.                      InfoLevel  : word;  {should be zero}
  13.                      Serial     : Longint;
  14.                      VolLabel   : array[0..10] of Char;
  15.                      FileSystem : array[0..7] of Char
  16.                    end;
  17.       SerString = String[9];
  18.       DTA_Type          = record
  19.                             Flag   : byte;
  20.                             Res1   : array [1..5] of byte;
  21.                             Mask   : Byte;
  22.                             Drive  : Byte;
  23.                             Name   : array [1..8] of Char;
  24.                             Ext    : array [1..3] of char;
  25.                             Attrx  : byte;
  26.                             Filler : array [12..21] of byte;
  27.                             Time,
  28.                             Date,
  29.                             Cluster,
  30.                             Size1,
  31.                             Size2  : integer;
  32.                           end;
  33.       FCB_Type          = record
  34.                             Flag   : byte;
  35.                             Res1   : array [1..5] of byte;
  36.                             Mask   : Byte;
  37.                             Drive  : Byte;
  38.                             Name   : array [1..8] of Char;
  39.                             Ext    : array [1..3] of char;
  40.                             Current_Block,
  41.                             Record_Size,
  42.                             Size1,
  43.                             Size2,
  44.                             Date   : integer;
  45.                             Filler : array [22..31] of byte;
  46.                             Record_No : byte;
  47.                             File_No_1,
  48.                             File_No_2 : integer
  49.                           end;
  50.       DiskIDType        = String[11];
  51.       STR12             = string[12];
  52.       STR8              = string[8];
  53.       STR4              = string[4];
  54.       MEDBUF       = array[1..4096] of char;
  55. var   Drive_Mask   : byte;
  56.       CH, CH1      : char;
  57.       DEVICE       : char;                                      { Disk Device }
  58.       BIN,BOUT,
  59.       BWORK        : ^MEDBUF;
  60.       F            : File;
  61.       SNAME        : String;
  62.       DATE         : string[8];                  { formatted date as YY/MM/DD }
  63.       TIME         : string[5];                  {     "     time as HH:MM    }
  64.       DISKNAME     : string[15];
  65.       GARB         : string[6];                        { extraneous device id }
  66.       DirInfo      : SearchRec;                       { File name search type }
  67.       SR           : SearchRec;
  68.       DT           : DateTime;
  69.       PATH         : PathStr;
  70.       DIR          : DirStr;
  71.       FNAME        : NameStr;
  72.       EXT          : ExtStr;
  73.       FCB          : FCB_Type;
  74.       DTA          : DTA_Type;
  75.       Regs         : Registers;
  76.       Temp         : String[1];
  77.       DiskID       : DiskIDType;
  78.       NewDiskID    : DiskIDType;
  79.       BUFF         : array[1..BSize] of Byte;
  80.       IB           : InfoBuffer;
  81.       S            : string[11];
  82.  
  83. function SerialStr(L : longint) : SerString;
  84. var Temp : SerString;
  85. begin
  86.   Temp[0] := #9;
  87.   Temp[1] := HexDigits[L shr 28];
  88.   Temp[2] := HexDigits[(L shr 24) and $F];
  89.   Temp[3] := HexDigits[(L shr 20) and $F];
  90.   Temp[4] := HexDigits[(L shr 16) and $F];
  91.   Temp[5] := '-';
  92.   Temp[6] := HexDigits[(L shr 12) and $F];
  93.   Temp[7] := HexDigits[(L shr 8) and $F];
  94.   Temp[8] := HexDigits[(L shr 4) and $F];
  95.   Temp[9] := HexDigits[L and $F];
  96.   SerialStr :=Temp;
  97. end;
  98.  
  99. procedure INITS;                              { basic FCB, DTA initialization }
  100. begin
  101.   Drive_Mask := Ord(DEVICE) - 64;
  102.   with Regs do
  103.     begin
  104.       AH := $1A; DS := Seg(DTA); DX := Ofs(DTA); MSDOS (Regs);
  105.     end;
  106.   with FCB do
  107.     begin
  108.       Flag := $FF; Mask := $08;
  109.       for I := 1 to 5 do
  110.         Res1[I] := 0;
  111.       Drive := Drive_Mask; Name := '????????'; Ext := '???';
  112.     end;
  113. end;  { INITS }
  114.  
  115. function GetSerial(DiskNum : byte; var I : InfoBuffer) : word;
  116. assembler;
  117.   asm
  118.     MOV AH, 69h
  119.     MOV AL, 00h
  120.     MOV BL, DiskNum
  121.     PUSH DS
  122.     LDS DX, I
  123.     INT 21h
  124.     POP DS
  125.     JC @Bad
  126.     XOR AX, AX
  127.   @Bad:
  128. end;
  129.  
  130. function SetSerial(DiskNum : byte; var I : InfoBuffer) : word;
  131. Assembler;
  132.   asm
  133.     MOV AH, 69h
  134.     MOV AL, 00h
  135.     MOV BL, DiskNum
  136.     PUSH DS
  137.     LDS DX, I
  138.     INT 21h
  139.     POP DS
  140.     JC @Bad
  141.     XOR AX, AX
  142.   @Bad:
  143. end;
  144.  
  145. function GetDiskID (Drive : char): DiskIDType;
  146. var DirDiskID : STR12;
  147.     PosPeriod : Byte;
  148. begin
  149.   FindFirst (DEVICE+':\*.*',VolumeID,DirInfo);
  150.   if DosError = 0 then
  151.     begin
  152.       DirDiskID := DirInfo.Name; PosPeriod := Pos('.',DirDiskID);
  153.       if PosPeriod > 0 then System.Delete(DirDiskID,PosPeriod,1);
  154.       GetDiskID := DirDiskID;
  155.       GetSerial (Drive_Mask,IB);                           { Get Disk Serial# }
  156.     end
  157.   else GetDiskID := '';
  158. end;  { GetDiskID }
  159.  
  160. function SetDiskID (DiskID : DiskIDType): Boolean;       { SET a volume label }
  161. begin
  162.   with FCB do
  163.     begin
  164.       FillChar (Name[1],11,' ');                             { blank out name }
  165.       Move (DiskID[1],Name[1],Length(DiskID));
  166.     end;
  167.   with Regs do
  168.     begin
  169.       AH := $16; DS := Seg(FCB); DX := Ofs(FCB);
  170.       MsDos(Regs); SetDiskID := AL = 0
  171.     end
  172. end;  { SetDiskID }
  173.  
  174. function DeleteDiskID : boolean;                      { DELETE a volume label }
  175. begin
  176.   with Regs do
  177.     begin
  178.       AH := $13; DS := Seg(FCB); DX := Ofs(FCB);
  179.       MsDos(Regs); DeleteDiskID := AL = 0;
  180.     end
  181. end;  { DeleteDiskID }
  182.  
  183. function ReNameDiskID (NewDiskID : DiskIDType): Boolean;    { RENAME a volume }
  184. begin
  185.   if not DeleteDiskID then writeln ('Delete Error: ',Regs.AL);
  186.   if not SetDiskID (NewDiskID) then writeln ('Rename error: ',Regs.AL);
  187. end;  { RenameDiskID }
  188.  
  189. procedure SetDiskInfo;
  190. begin
  191.   with Regs do
  192.     begin
  193.       AH := $36; DL := Drive_Mask; MsDos(Regs);
  194.       ASZ := LongInt(CX * AX) * DX; FSZ := LongInt(AX * CX) * BX;
  195.       USZ := ASZ - FSZ;                                         { amount free }
  196.     end;
  197. end;  { SetDiskInfo }
  198.  
  199.